package site.xuqing.appbus;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import site.xuqing.appbus.queue.EventQueue;

/**
 * @author xuqing
 * @Description Server
 * @createTime 2022年01月26日 16:08:42
 */
public class Server {
    private final Map<Client, String> mClientMap;
    private final EventQueue mEventQueue;
    
    public Server() {
        mClientMap = new HashMap<>();
        mEventQueue = new EventQueue();
    }
    
    /**
     * 添加连接到Server
     *
     * @param route  路由
     * @param client 连接对象
     */
    public void addClient(String route, Client client) {
        mClientMap.remove(client);
        mClientMap.put(client, route);
    }
    
    /**
     * 获取连接
     *
     * @param route 路由
     * @return 获取到的连接对象
     */
    public List<Client> getClient(String route) {
        List<Client> keyList = new ArrayList<>();
        for (Client key : mClientMap.keySet()) {
            if (route.equals(mClientMap.get(key))) {
                keyList.add(key);
            }
        }
        return keyList;
    }
    
    /**
     * 获取所有的Client
     *
     * @return List<Client>
     */
    public List<Client> getAllClient() {
        return new ArrayList<>(mClientMap.keySet());
    }
    
    /**
     * 添加消息到对象
     *
     * @param route 路由
     * @param data  消息对象
     * @param <T>   消息类型
     */
    public <T> void addMsgToQueue(String route, T data) {
        mEventQueue.inQueue(route, data);
    }
    
    /**
     * 从队列获取消息
     *
     * @param route 路由
     * @param <T>   获取的消息的类型
     * @return 获取到的消息列表
     */
    public <T> List<T> getMsgFromQueue(String route) {
        return mEventQueue.outQueue(route);
    }
    
    /**
     * 移除指定的连接对象
     *
     * @param route 路由
     */
    public void removeClient(String route) {
        for (Iterator<Entry<Client, String>> it = mClientMap.entrySet().iterator(); it.hasNext();){
            Entry<Client, String> item =it.next();
            if (route.equals(item.getValue())){
                it.remove();
            }
        }
    }
    
    /**
     * 移除所有的连接对象
     */
    public void removeAllClient() {
        mClientMap.clear();
    }
}
